<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script>
        // // 1.简单数据类型传参 只传递值和结果 变量互不影响
        // function fu(a) {//形参可以看做是一个未定义的变量 x = 10 接收实参传递则 var a = x
        //     a++
        //     console.log(a);//输出就是 11
        // }
        // var x = 10;
        // fn(x)
        // console.log(x);//简单类x的值是在 栈空间里 另外复制了一份给形参a 所以外部的x是不受函数代码体影响的  输出的结果依然是 x = 10

        // // 个人通过作用域链的方式来分析输出的结果
        // var x
        // function fu(a) { //这里的形参 约等于是写了这么一句代码 var a = undefined 单独在函数里声明为局部变量 局部变量的操作 不会影响全局变量
        //     var a
        //     //a = undefinde
        //     a++
        //     console.log(a);// a从undfined 接收x的10 自加后 输出结果就是 11
        // }
        // x = 10
        // fn(x)
        // console.log(x);//x可以是一个全局变量 函数内部并没有给他重新赋值 所以依然是 10

        // 2.复杂数据类型传参 传递的是变量栈地址 操作的都是同一个对象数据 所以内部重新赋值会影响外部

        function Person(name) {
            this.name = name
        }
        // x = p  p在栈空间的 堆地址给了x 他俩的都会指向同一个堆空间的数据 也就是同一个对象
        function f1(x) {
            //x的堆地址跟p一样 所以指向堆空间的数据就是一样的    刘德华
            console.log(x.name);
            //x变量重新赋值了堆空间的数据
            x.name = '张学友'
            //再次输出就指向的是堆空间这个新数据
            console.log(x.name);
        }
        // p地址存放在栈空间  new Person('刘德华')数据是存放堆空间
        var p = new Person('刘德华')
        console.log(p.name);//刘德华 
        f1(p)
        // p的地址跟x相同 所以指向堆空间的数据也会相同  x对数据进行了重新赋值 所以 p.name = x.name = 张学友
        // console.log(p.name);


        function Person(name) {
            this.name = name
        }
        function f1(x) {
            console.log(x.name);
            x.name = '张学友'
            console.log(x.name);
        }
        var p = new Person('刘德华')
        console.log(p.name);
        f1(p)
        console.log(p.name);


        // var p
        // f1(p)
        // function Person(name) {
        //     this.name = name
        // }
        // function f1(x) {
        //     console.log(x.name)//刘德华
        //     x.name = '张学友'
        //     console.log(x.name);//张学友
        // }
        // p = new Person('刘德华')
        // console.log(p.name);
        // console.log(p.name);

    </script>
</head>

<body>

</body>

</html>